#!/usr/bin/env python3
"""
Behavior Analysis Agent - 用户行为分析 Agent（可复用）
"""
import logging
from typing import Dict, Any

# Flink Agents imports
from flink_agents.api.agent import Agent
from flink_agents.api.decorators import action
from flink_agents.api.events.event import Event, InputEvent, OutputEvent
from flink_agents.api.runner_context import RunnerContext

# 导入共享的处理器
from handlers.llm_handler import call_llm_api, load_prompt_template
from handlers.rule_handler import analyze_with_rules

logger = logging.getLogger(__name__)

# 全局 Prompt 模板
PROMPT_TEMPLATE = load_prompt_template()


class BehaviorAnalysisAgent(Agent):
    """
    用户行为分析 Agent（使用 flink-agents）
    
    该 Agent 可以在本地模式和集群模式下复用：
    - 本地模式：from_list() + to_list()
    - 集群模式：from_datastream() + to_datastream()
    """
    
    @action(InputEvent)
    @staticmethod
    def process(event: Event, ctx: RunnerContext):
        """
        处理单个浏览器事件
        
        输入：event.input = {'value': {事件数据}}
        输出：OutputEvent(output={分析结果})
        """
        try:
            if event.input is None:
                logger.warning("⚠️  Received empty event, skipping")
                return
            
            # 提取事件数据（flink-agents 格式：{'value': data}）
            event_data = event.input.get('value', event.input) if isinstance(event.input, dict) else event.input
            
            # 提取用户信息
            user_id = event_data.get('userId', 'unknown')
            url = event_data.get('url', '')
            
            # 尝试使用 LLM 分析
            llm_result = call_llm_api(event_data, PROMPT_TEMPLATE)
            
            if llm_result:
                # LLM 分析成功
                result = {
                    'user_id': user_id,
                    'url': url,
                    'behavior_type': llm_result.get('behavior_type', 'other'),
                    'behavior_description': llm_result.get('behavior_description', ''),
                    'confidence': llm_result.get('confidence', 0.5),
                    'analysis_method': 'flink_agents_llm'
                }
            else:
                # 降级到规则引擎
                rule_result = analyze_with_rules(event_data)
                result = {
                    'user_id': user_id,
                    'url': url,
                    'behavior_type': rule_result['behavior_type'],
                    'behavior_description': rule_result['behavior_description'],
                    'confidence': rule_result['confidence'],
                    'analysis_method': 'flink_agents_rule'
                }
            
            # 发送结果
            ctx.send_event(OutputEvent(output=result))
            
        except Exception as e:
            logger.error(f"❌ Agent 处理异常: {e}")
            import traceback
            traceback.print_exc()

